package leetcode.code0224;

public class Solution extends Solution224 {

	@Override
	public int calculate(String s) {
		// " (1+(4+5+2)-3)+( 6+8) "
		return this.f(s.toCharArray(), 0)[0];
	}

	// index开始处理的位置,ans[0] f的结果 ans[1]')'的位置
	public int[] f(char[] s, int index) {
		int sum = 0; // 当前f的计算结果 f()[0]
		int num = 0; // 字符串中当前处理的数字
		char op = '+'; // 起始的结果sum和num的关系一定是`加法`
		for (int i = index; i < s.length; i++) {
			if (s[i] >= '0' && s[i] <= '9') {
				num = num * 10 + s[i] - '0';// 拼接连续的数字
				continue;
			}
			if (s[i] == '+' || s[i] == '-') {// 遇见操作符
				if (op == '+') {// 结算之前的结果sum
					sum += num;
				} else {
					sum -= num;
				}
				num = 0;// 重置为0,重新接收数值
				op = s[i];// 当前未处理的操作符
			} else if (s[i] == '(') {// 遇见左括号
				int[] sub = this.f(s, i + 1);// 由子过程为我算出计算结果
				num = sub[0];// 子过程的结果
				i = sub[1];// 子过程最终)的位置, 需要处理的下一个字符由i++负责移动
			} else if (s[i] == ')') {// 当前f由右括号结束
				if (op == '+') {// 结算最后的数字和操作符
					sum += num;
				} else {
					sum -= num;
				}
				return new int[] { sum, i };// 返回结果和)位置
			}
		}
		if (op == '+') {// 当前f由字符串到达结尾结束
			sum += num;// 结算结果
		} else {
			sum -= num;
		}
		return new int[] { sum, 0 };//这个一定是最后了, 没有)括号了,
	}

	public static void main(String[] args) {
		Solution so = new Solution();
		so.debug1();
		so.debug2();
		so.debug3();

	}

}
